package com.itheima.b_string;

/**
 * 目标：String内存图解
 * <p>
 * 1、只要是以“...”方式写出的字符串对象，会存储到字符串常量池，且相同内容的字符串只存储一份；
 * 2、但通过new方式创建字符串对象，每new一次都会产生一个新的对象放在堆内存中。
 * 3、String对象的内容不可改变，被称为不可变字符串对象。做字符串拼接时会创建新的字符串，并不是把字符串原有的内容改变了。
 * 4、Java在编译时存在优化机制，对于完全是字面量的运算，会在编译期就得到结果
 */
public class StringDemo03 {

    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc"; //以字符串字面量的方式给出的对象在字符串常量池，常量池中相同数据的对象空间只能有一个
        System.out.println(s1 == s2);
        System.out.println("================================================================");


        char[] chs = {'a', 'b', 'c'};
        String str1 = new String(chs);
        String str2 = new String(chs); //每new一次，都会在堆内存新开辟一个对象空间！不管内容是否一样！
        System.out.println(str1 == str2);
        System.out.println("================================================================");


        String name = "黑马";
        System.out.println("字符串对象空间地址：" + System.identityHashCode(name));//获取字符串对象空间地址
        name += "程序员";
        System.out.println("字符串对象空间地址：" + System.identityHashCode(name));//获取字符串对象空间地址
        name += "播妞";
        System.out.println("字符串对象空间地址：" + System.identityHashCode(name));//获取字符串对象空间地址
        System.out.println("================================================================");


        String ss1 = "abc";
        String ss2 = "a" + "b" + "c"; //Java在编译时存在优化机制，对于完全是字面量的运算，会在编译期就得到结果
        System.out.println(ss1 == ss2);
        System.out.println("================================================================");
    }
}
